package com.ermao.controller;

import com.ermao.pojo.User;
import com.ermao.service.UserService;
import com.ermao.utils.CheckValidUtils;
import com.ermao.utils.Result;
import com.ermao.utils.ResultGenerator;
import lombok.extern.log4j.Log4j2;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

/**
 * 用户信息模块
 * @author Ermao
 * Date: 2021/8/30 22:28
 */
@Log4j2
@Controller
@RequestMapping("/api/v1/users")
public class UserController {

	@Resource
	private UserService userService;

	/**
	 * 用户注册
	 * @param accountNumber 帐号 十进制下 9 位数整型（契合int范围），全局唯一、不可更改
	 * @param password 密码 不短于 6 个字符，不长于 16 个字符，只能使用英文字母大小写、数字
	 * @param email 邮箱 符合邮箱规则即可
	 * @return json 结果对象
	 */
	@PostMapping("")
	@ResponseBody
	public Result signUp(@RequestParam("accountNumber") Integer accountNumber,
						 @RequestParam("password") String password,
						 @RequestParam("email") String email) {
		StringBuilder sb = new StringBuilder();
		boolean invalid = false;
		if (!CheckValidUtils.checkAccountNumber(accountNumber)) {
			sb.append("帐号 ");
			invalid = true;
		}
		if (!CheckValidUtils.checkPassword(password)) {
			sb.append("密码 ");
			invalid = true;
		}
		if (!CheckValidUtils.checkEmail(email)) {
			sb.append("邮箱 ");
			invalid = true;
		}

		if (invalid) {
			return ResultGenerator.genFailResult(sb.append("不合法").toString());
		} else {
			// 用户信息合法，进一步检验帐号是否存在
			if (userService.isExistUserByAccountNumber(accountNumber)) {
				return ResultGenerator.genFailResult("帐号已被注册，请更改帐号");
			} else {
				if (userService.registerANewUser(accountNumber, password, email)) {
					return ResultGenerator.genSuccessResult();
				} else {
					return ResultGenerator.genFailResult("用户注册失败，请联系管理员或者稍后重试");
				}
			}
		}
	}

	/**
	 * 用户登录
	 * @param accountNumber 账号
	 * @param password 密码
	 * @param request http 请求
	 * @return json 结果对象
	 */
	@PostMapping("/cookies")
	@ResponseBody
	public Result login(@RequestParam("accountNumber") Integer accountNumber,
						@RequestParam("password") String password,
						HttpServletRequest request) {
		// 校验用户名和密码合法性
		if (!CheckValidUtils.checkUser(accountNumber, password)) {
			return ResultGenerator.genFailResult("请输入规范的用户名和密码");
		}
		// 登录
		if (userService.login(accountNumber, password, request)) {
			// 成功登录
			return ResultGenerator.genSuccessResult();
		} else {
			return ResultGenerator.genFailResult("登录失败");
		}
	}

	/**
	 * 用户退出登录
	 * @param userId 用户 ID
	 * @param request http请求
	 * @return json 结果对象
	 */
	@DeleteMapping("/cookies/{userid}")
	@ResponseBody
	public Result logout(@PathVariable("userid") Integer userId,
						HttpServletRequest request) {
		// 删除会话
		request.getSession().invalidate();
		return ResultGenerator.genSuccessResult();
	}

	/**
	 * 根据用户帐号获取用户信息
	 * @param accountNumber 用户帐号
	 * @return 用户 ID、昵称、打卡天数
	 */
	@GetMapping("/{accountNumber}")
	@ResponseBody
	public Result getUserInfoByUserId(@PathVariable("accountNumber") Integer accountNumber) {
		// 校验帐号是否合法
		if (!CheckValidUtils.checkAccountNumber(accountNumber)) {
			return ResultGenerator.genFailResult("获取用户信息失败，帐号不合法");
		}
		// 根据帐号检索用户全部信息
		User user = userService.selectAUserByAccountNumber(accountNumber);
		if (user != null) {
			return ResultGenerator.genSuccessResult(user);
		} else {
			return ResultGenerator.genFailResult("帐号错误");
		}
	}

	/**
	 * 修改昵称
	 * @param userId 用户 ID
	 * @param nickname 用户新昵称
	 * @return json 结果对象
	 */
	@PutMapping("/profiles")
	@ResponseBody
	public Result modifyUserInfo(@RequestParam("userId") Integer userId,
								 @RequestParam("nickname") String nickname) {
		// 校验新的用户名是否合法
		if (!CheckValidUtils.checkNickname(nickname)) {
			return ResultGenerator.genFailResult("请输入规范的昵称");
		}
		User user = userService.selectAUserByUserId(userId);
		if (user != null) {
			if (userService.updateUserNickname(user, nickname)) {
				return ResultGenerator.genSuccessResult();
			} else {
				return ResultGenerator.genFailResult("修改用户信息信息失败");
			}
		} else {
			return ResultGenerator.genFailResult("修改用户信息信息失败");
		}
	}

	/**
	 * 修改账户密码
	 * @param userId 用户 ID
	 * @param oldPassword 旧密码
	 * @param newPassword 新密码
	 * @return json 结果对象
	 */
	@PutMapping("/password")
	@ResponseBody
	public Result modifyPassword(@RequestParam("userId") Integer userId,
								 @RequestParam("oldPassword") String oldPassword,
								 @RequestParam("newPassword") String newPassword) {
		// 校验新的用户名是否合法
		if (!CheckValidUtils.checkPassword(newPassword)) {
			return ResultGenerator.genFailResult("请输入规范的新密码");
		}

		if (!CheckValidUtils.checkPassword(oldPassword)) {
			return ResultGenerator.genFailResult("请输入规范的旧密码");
		}
		User user = userService.selectAUserByUserId(userId);
		if (user != null) {
			if (userService.updateUserPassword(user, oldPassword, newPassword)) {
				return ResultGenerator.genSuccessResult();
			} else {
				return ResultGenerator.genFailResult("原密码错误");
			}
		} else {
			return ResultGenerator.genFailResult("修改密码失败");
		}
	}
}
